package pro.shushi.pamirs.hr.core.excel.imports;

import com.alibaba.excel.util.StringUtils;
import org.springframework.stereotype.Component;
import pro.shushi.pamirs.core.common.InitializationUtil;
import pro.shushi.pamirs.file.api.context.ExcelDefinitionContext;
import pro.shushi.pamirs.file.api.context.ExcelImportContext;
import pro.shushi.pamirs.file.api.enmu.ExcelTemplateTypeEnum;
import pro.shushi.pamirs.file.api.enmu.TaskMessageLevelEnum;
import pro.shushi.pamirs.file.api.extpoint.AbstractExcelImportDataExtPointImpl;
import pro.shushi.pamirs.file.api.extpoint.ExcelImportDataExtPoint;
import pro.shushi.pamirs.file.api.model.ExcelImportTask;
import pro.shushi.pamirs.file.api.model.ExcelWorkbookDefinition;
import pro.shushi.pamirs.file.api.util.ExcelHelper;
import pro.shushi.pamirs.file.api.util.ExcelTemplateInit;
import pro.shushi.pamirs.hr.api.model.eam.BsMtool;
import pro.shushi.pamirs.hr.core.util.CustomModelUtil;
import pro.shushi.pamirs.meta.annotation.ExtPoint;
import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j;

import java.util.Collections;
import java.util.List;

/**
 * 工装信息导入
 *
 * 数据导入导出参考：
 */
@Slf4j
@Component
public class BsMtoolImportTemplate extends AbstractExcelImportDataExtPointImpl<List<BsMtool>>
        implements ExcelTemplateInit, ExcelImportDataExtPoint<List<BsMtool>> {

    public static final String TEMPLATE_NAME = "工装信息导入";

    @Override
    public List<ExcelWorkbookDefinition> generator() {
        // 如果需要保证数据的完整性，如果操作多个表保证事务，这块可以定义事务
        // InitializationUtil.addTxConfig(BsMtool.MODEL_MODEL, ExcelDefinitionContext.EXCEL_TX_CONFIG_PREFIX + TEMPLATE_NAME);

        return Collections.singletonList(ExcelHelper.fixedHeader(BsMtool.MODEL_MODEL, TEMPLATE_NAME)
                .setType(ExcelTemplateTypeEnum.IMPORT)
                .createSheet("工装信息列表")
                .createBlock(BsMtool.MODEL_MODEL)
                // orgCode类似这样的字段通常Excel导入模版会写组织名称,在导入逻辑中查询
                .addColumn("orgCode", "组织编码")
                .addColumn("mtoolCode", "工装编码")
                .addColumn("mtoolName", "工装名称")
                .addColumn("mmdCode", "工装型号编码")
                .addColumn("mfDevSn", "出厂序列号")
                .addColumn("assetCode", "资产编码")
                .addColumn("locStat", "位置状态")
                .addColumn("mtoolStat", "状态")
                .addColumn("storeCode", "仓库编码")
                .addColumn("storelocCode", "储位编码")
                .addColumn("scrapTime", "报废时间")
                .addColumn("lastUkDate", "最后保养日期")
                .addColumn("ukUsedTimes", "保养后使用次数")
                .addColumn("totUsedTimes", "总使用次数")
                .addColumn("devCode", "设备编码")
                .addColumn("isSick", "带病作业")
                .addColumn("mtoolSrcType", "来源")
                .addColumn("isValid", "启用")
                .addColumn("remark", "备注")
                .build().setEachImport(false)
                //.setHasErrorRollback(true) //有一条报错全回滚(前提需要定义一个事务)
                // .setHasErrorRollback(true) 在定义了事务的情况下，这里可以设置出错是否回滚
        );
    }

    @Override
    @ExtPoint.Implement(expression = "importContext.definitionContext.model == \"" + BsMtool.MODEL_MODEL + "\" && importContext. definitionContext.name == \"" + TEMPLATE_NAME + "\"")
    public Boolean importData(ExcelImportContext importContext, List<BsMtool> dataList) {
        ExcelImportTask importTask = importContext.getImportTask();

        //测试校验整体数据
        if (dataList == null) {
            importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, "导入文件数据为空，请填写数据");
            return Boolean.FALSE;
        }
        //暂时模拟每次导入数据大于n条报错
//        if(dataList.size() > 3){
//            importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, "导入文件数据量大于1000000条，导入失败");
//            return false;
//        }


        //测试校验每一条数据
        String modelModel = BsMtool.MODEL_MODEL;
        for(BsMtool data: dataList){
            try{
                if(StringUtils.isBlank(data.getMtoolCode())){
                    // 返回true表示继续读下一行。返回false表示中断
                    importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, CustomModelUtil.getFieldDisplayName(modelModel,"mtoolCode")+"不能为空");
                    continue;
                }

                if(StringUtils.isBlank(data.getMtoolName())){
                    // 返回true表示继续读下一行。返回false表示中断
                    importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, CustomModelUtil.getFieldDisplayName(modelModel,"mtoolName")+"不能为空");
                    continue;
                }

                if(StringUtils.isBlank(data.getMmdCode())){
                    // 返回true表示继续读下一行。返回false表示中断
                    importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, CustomModelUtil.getFieldDisplayName(modelModel,"mmdCode")+"不能为空");
                    continue;
                }


                data.create();
            } catch (Exception ex){
                importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, ex.getMessage());
            }

        }


        // 其他数据校验
        return Boolean.TRUE;
    }

}
